package it.polimi.traveldream.managers;

import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;

import it.polimi.traveldream.persistence.PacchettoPersonalizzato;
import it.polimi.traveldream.persistence.PrenotazioneHotel;
import it.polimi.traveldream.persistence.PrenotazioneTour;
import it.polimi.traveldream.persistence.PrenotazioneVolo;
import it.polimi.traveldream.persistence.dtos.PacchettoPersonalizzatoDTO;
import it.polimi.traveldream.persistence.dtos.PrenotazioneHotelDTO;
import it.polimi.traveldream.persistence.dtos.PrenotazioneTourDTO;
import it.polimi.traveldream.persistence.dtos.PrenotazioneVoloDTO;

@Stateless
public class PacchettoPersonalizzatoManagerImpl implements
		PacchettoPersonalizzatoManager {

	@EJB(beanName="ProductManagerImpl")
	private ProductManager productMgr;

	@PersistenceContext
	private EntityManager em;

	@Override
	public PacchettoPersonalizzatoDTO findByID(int ID) {
		PacchettoPersonalizzato pacc = em.find(PacchettoPersonalizzato.class, ID);
		return convert(pacc);
	}

	private ProductManagerImpl getProductManager() {
		return (ProductManagerImpl) productMgr;
	}

	public PacchettoPersonalizzatoDTO convert(PacchettoPersonalizzato paccPers) {
		PacchettoPersonalizzatoDTO paccPersDTO = new PacchettoPersonalizzatoDTO();
		paccPersDTO.setIDPacchetto(paccPers.getIDPacchettoPers());
		paccPersDTO.setIDPacchettoOriginale(paccPers.getPacchetto().getID());
		paccPersDTO.setPrenotazione(paccPers.getPrenotazione());
		paccPersDTO.setHotels(ConverterFactory.convertList(paccPers.getPrenotazioneHotels1(),
				new ConverterFactory.ConverterCallback<PrenotazioneHotel, PrenotazioneHotelDTO>() {
					@Override
					public PrenotazioneHotelDTO autoConvert(
							PrenotazioneHotel dto) {
						return convert(dto);
					}
				}));
		paccPersDTO.setTours(ConverterFactory.convertList(paccPers.getPrenotazioneTours1(),
				new ConverterFactory.ConverterCallback<PrenotazioneTour, PrenotazioneTourDTO>() {
					@Override
					public PrenotazioneTourDTO autoConvert(PrenotazioneTour dto) {
						return convert(dto);
					}
				}));
		paccPersDTO.setVoli(ConverterFactory.convertList(paccPers.getPrenotazioneVolos1(),
				new ConverterFactory.ConverterCallback<PrenotazioneVolo, PrenotazioneVoloDTO>() {
					@Override
					public PrenotazioneVoloDTO autoConvert(PrenotazioneVolo dto) {
						return convert(dto);
					}
				}));
		return paccPersDTO;
	}

	public PrenotazioneHotelDTO convert(PrenotazioneHotel prenHotel) {
		PrenotazioneHotelDTO prenHotelDTO = new PrenotazioneHotelDTO();
		prenHotelDTO.setCheckIN(prenHotel.getCheckin());
		prenHotelDTO.setCheckOUT(prenHotelDTO.getCheckOUT());
		prenHotelDTO.setHotel(getProductManager().convert(prenHotel.getHotel()));
		prenHotelDTO.setIDPrenotazione(prenHotel.getIDPrenotazione());
		prenHotelDTO.setNumeroPersone(prenHotel.getNumeroPersone());
		return prenHotelDTO;
	}

	public PrenotazioneTourDTO convert(PrenotazioneTour prenTour) {
		PrenotazioneTourDTO prenTourDTO = new PrenotazioneTourDTO();
		prenTourDTO.setData(prenTour.getData());
		prenTourDTO.setIDPrenotazione(prenTour.getIDPrenotazione());
		prenTourDTO.setNumeroPersone(prenTour.getNumeroPersone());
		prenTourDTO.setTour(getProductManager().convert(prenTour.getTour()));
		return prenTourDTO;
	}

	public PrenotazioneVoloDTO convert(PrenotazioneVolo prenVolo) {
		PrenotazioneVoloDTO prenVoloDTO = new PrenotazioneVoloDTO();
		prenVoloDTO.setData(prenVolo.getData());
		prenVoloDTO.setIdPrenotazione(prenVolo.getIDPrenotazione());
		prenVoloDTO.setNumeroPersone(prenVolo.getNumeroPersone());
		prenVoloDTO.setTrattaVolo(getProductManager().convert(prenVolo.getTrattaVolo()));
		return prenVoloDTO;
	}
}
